#!/bin/bash

# Name: 段锦涛
# Desc: 监控系统负载
# Example: 
# Usage: 
# Update: 2023-09-20


# 监控系统负载，如果系统负载超过10，需要记录系统状态信息
# 1. 系统负载命令使用uptime看，过去1分钟的平均负载
# 2. 系统状态使用如下工具标记: top、 vmstat、 ss
# 3. 要求每隔20s监控一次
# 4. 系统状态信息需要保存到/opt/logs/下面， 保留一个月，文件名带有`data +%s` 后缀


# 查看/opt/logs目录是否存在，不在就创建
[ -d /opt/logs ] || mkdir -p /opt/logs

# while 死循环
while :
do 
	# 获取系统1分钟的负载，并且只取小数点前面的数字
	load=`uptime | awk -F'average:' '{print$2}' | cut -d',' -f1 | sed 's/ //g' | cut -d. -f1`
	# 如果负载超过10
	if [ $load -gt 10 ]
	then
		# 分别记录top、 vmstat和ss命令的执行结果, 记录前100行记录
		top -bn1 | head -n 100 > /opt/logs/top.`date +%s`
		# 记录10秒钟
		vmstat 1 10 > /opt/logs/vmstat.`date +%s`
		# 记录网络连接状态
		ss -an > /opt/logs/ss.`date +%s`
	fi
	# 休眠20秒
	sleep 20
	# 找到30天以前的日志文件删除掉
	find /opt/logs \{ -name "top*" -o -name "vmstat*" -o -name "ss*" \} -mtime +30 | xargs rm -f
done

<<'COMMENT'
总结：
1. || 用在两条命令中间，当前面命令不成功就会执行后面命令
2. 死循环可以使用 while : + sleep 组合
3. 边写脚本边在命令行里调试
4. find  里面可以使用小括号将多个条件组合起来当成一个整体

COMMENT
